      <h1 class="entry-title entry-title-single" itemprop="headline">ALV FIELDCAT添加属性 &#8211; REUSE_ALV_FIELDCATALOG_MERGE函数</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <p>在上篇文章中，介绍了ALV的两个输出<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span>，及其 Layout 和 Fieldcat 的相关属性；</p>
<p>在 ALV 定义 Fieldcat 的时候，我们往往需要通过 slis_fieldcat_alv 的赋值给Fieldcat导入结构。</p>
<p>如上篇文章中给出的例子：</p>
<pre class="brush: abap;">

DATA: wa_fieldcat TYPE slis_fieldcat_alv ,    
      i_fieldcat  TYPE slis_t_fieldcat_alv ,   
      i_layout    TYPE slis_layout_alv.

wa_fieldcat-tabname     = 'I_TAB'.
wa_fieldcat-fieldname   = 'MATNR'.        " 需要输出的内表的字段名
wa_fieldcat-seltext_l   = 'Material NO.'. " 字段的描述-长字段标签
wa_fieldcat-seltext_m   = 'Material NO.'. " 字段描述-中字段标签
wa_fieldcat-seltext_s   = 'Material NO.'. " 字段描述-短字段标签
wa_fieldcat-fix_column  = 'X' .           " 是否是固定列

APPEND wa_fieldcat TO i_fieldcat.
CLEAR  wa_fieldcat.

</pre>
<p><span id="more-622"></span><br />
&nbsp;</p>
<p>上面的例子中，只给 fieldcat 中增加了一行记录，即 ALV 只输出一列数据；</p>
<p>如若我们需要输出的 ALV 字段非常多，比如50个字段（会有这种需求）；</p>
<p>这时候，就会重复操作同样的赋值语句，这只会增加我们的开发量，没法提高效率；</p>
<p>如果开发中又需要对一些字段做属性修改，又需要对相应的 Fieldcat 字段添加属性，这又是一个烦躁的过程；</p>
<p>&nbsp;</p>
<p>一般这种情况下，可以通过两种方法解决上面的问题。</p>
<p>一种是通过定义宏，来为Fieldcat 赋值；</p>
<p>一种是通过REUSE_ALV_FIENDCATALOG_MERGE<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span>为Fieldcat赋值。</p>
<p>或者是两种方法结合。</p>
<p><strong>1. 宏定义</strong></p>
<p>宏定义的操作较为简单，不做详细说明，这里直接给出示例：</p>
<pre class="brush: abap;">

DATA: gw_fieldcat_print TYPE lvc_s_fcat,
      gt_fieldcat_print TYPE lvc_t_fcat.

* 定义宏
DEFINE def_fieldcat_print.

  clear gw_fieldcat_print.

  gw_fieldcat_print-fieldname = &#038;1. "字段名称
  gw_fieldcat_print-ref_table = &#038;2. "参考内表
  gw_fieldcat_print-reptext   = &#038;3. "字段名称
  gw_fieldcat_print-coltext   = &#038;3. "字段名称
  gw_fieldcat_print-scrtext_l = &#038;3. "长文本
  gw_fieldcat_print-scrtext_m = &#038;3. "中文本
  gw_fieldcat_print-scrtext_s = &#038;3. "短文本
  gw_fieldcat_print-no_zero   = &#038;4. "去零显示
  gw_fieldcat_print-edit      = &#038;5. "编辑
  gw_fieldcat_print-outputlen = &#038;6. "字段输出长度
  gw_fieldcat_print-checkbox  = &#038;7. "以复选框形式输出
  gw_fieldcat_print-do_sum    = &#038;8. "小计

  append gw_fieldcat_print to gt_fieldcat_print.

END-OF-DEFINITION.

* 定义宏 
def_fieldcat_print 'CHECK' '' '选择'       ''  'X' '10' 'X' ''.
def_fieldcat_print 'KDAUF' '' '订单号'     'X' ''  '10' ''  ''.
def_fieldcat_print 'KDPOS' '' '行项目号'   ''  ''  '6'  ''  ''.
def_fieldcat_print 'WERKS' '' '工厂'       ''  ''  '6'  ''  ''.
def_fieldcat_print 'AUFNR' '' '生产工单号' 'X' ''  '10' ''  ''.

</pre>
<p>&nbsp;</p>
<p><strong>2. REUSE_ALV_FIENDCATALOG_MERGE函数</strong></p>
<p>REUSE_ALV_FIENDCATALOG_MERGE函数可以根据现有的内表结构返回FIELDCAT字段结构信息；</p>
<p>其中包括数据字典中的结构、透明表、视图，自定义的Add-On表、结构、视图；</p>
<p>也包括程序中定义的全局、局部结构、内表。</p>
<p>&nbsp;</p>
<p>REUSE_ALV_FIENDCATALOG_MERGE 函数的输入输出参数：</p>
<p>1) Import参数：</p>
<p><strong>I_PROGRAM_NAME</strong>：程序名称</p>
<p><strong>I_INTERNAL_TABNAME</strong>：内表名称，必须为输出内表的自定义STRUCTURE</p>
<p><strong>I_STRUCTURE_NAME</strong>：结构名称，直接参考数据字典中的透明表、视图或STRUCTURE</p>
<p><strong>I_CLIENT_NEVER_DISPLAY</strong>：显示Client字段</p>
<p><strong>I_INCLNAME</strong>：Include 名称</p>
<p>&nbsp;</p>
<p>2) Changing参数：</p>
<p><strong>CT_FIELDCAT</strong>：导出的Fieldcat结构信息</p>
<p>&nbsp;</p>
<p>这里需要注意的是，I_INTERNAL_TABNAME 与 I_STRUCTURE_NAME 参数只需一项。</p>
<pre class="brush: abap;">

DATA:BEGIN OF gt_out,  "输出表
     machine(5) TYPE n, 
     ton(5) TYPE n,
  END OF gt_out.

DATA：i_fieldcat  TYPE slis_t_fieldcat_alv.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_internal_tabname     = 'GT_OUT'
*    i_structure_name       = 'GT_OUT'
    i_inclname             = sy-repid
  CHANGING
    ct_fieldcat            = i_fieldcat[]
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

</pre>
<p>&nbsp;</p>
<p>从上面的程序可以看出，在定义内表结构时，使用了 Data 关键字来定义内表结构；</p>
<p>有时候，也会习惯于用TYPES关键字定义内表结构；但在这里，如若用Types定义结构时，该函数则会取不到任何相关的信息：</p>
<div id="attachment_623" style="width: 789px" class="wp-caption alignnone"><img src="http://www.sapjx.com/wp-content/uploads/2014/08/reuse_alv_fieldcatalog_merge.png" alt="reuse_alv_fieldcatalog_merge" width="779" height="397" class="size-full wp-image-623" /><p class="wp-caption-text">reuse_alv_fieldcatalog_merge</p></div>
<p>&nbsp;</p>
<p>然后，还要注意的一点是，由于REUSE_ALV_FIELDCATALOG_MERGE 函数中导出的Fieldcat结构为slis_t_fieldcat_alv；</p>
<p>故该函数只能和 <strong>REUSE_ALV_GRID_DISPLAY </strong>函数一起使用，不能用于 <strong>REUSE_ALV_GRID_DISPLAY_LVC</strong> 函数。</p>
<p>必须需要使用REUSE_ALV_GRID_DISPLAY_LVC 函数的，则可以通过前面讲到的定义宏来为Fieldcat提交相关信息。</p>
<p>&nbsp;</p>
<p>下面给出一个示例：</p>
<pre class="brush: abap;">

DATA:
BEGIN OF gt_out OCCURS 0,  "输出表
     machine(5) TYPE n,         "机台
     ton(5) TYPE n,             "吨位
     extwg LIKE mara-extwg,     "客户
     zeinr LIKE mara-zeinr,     "机种
     matnr LIKE mara-matnr,     "内部品番
     maktx LIKE makt-maktx,     "外部品番
     vgw04 LIKE afvv-vgw04,     "周期
     bmsch(16) TYPE n,          "取数
     ngrad LIKE kako-ngrad,     "收率
     abili(7)  TYPE p,         "日生产能力
     kpcs01(7) TYPE p  DECIMALS 3,         "产量
     days01(5) TYPE p  DECIMALS 2,         "生产天数
     work01(2) TYPE n,                     "工作天数
     acti01 LIKE konv-kbetr,               "稼动率
END OF gt_out.

* ALV 定义
TYPE-POOLS:slis.

DATA: g_repid LIKE sy-repid,
      gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gt_layout   TYPE slis_layout_alv.

DEFINE modify_fieldcat1.

  READ TABLE gt_fieldcat INDEX &#038;1.
  gt_fieldcat-seltext_m  = &#038;2.
  gt_fieldcat-ddictxt    = 'M'.
  MODIFY gt_fieldcat INDEX &#038;1.

END-OF-DEFINITION.


DATA:lv_index LIKE sy-tabix,
     lv_text TYPE scrtext_m.

g_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = g_repid
    i_internal_tabname     = 'GT_OUT'
    i_inclname             = g_repid
  CHANGING
    ct_fieldcat            = gt_fieldcat[]
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.



modify_fieldcat1: 1  '机台',
                  2  '吨位',
                  3  '客户',
                  4  '机种',
                  5  '内部品番',
                  6  '外部品番',
                  7  '周期',
                  8  '取数',
                  9  '收率',
                  10 '日生产能力'.


READ TABLE gt_fieldcat INDEX 8.
gt_fieldcat-no_zero  = 'X'.
MODIFY gt_fieldcat INDEX 8.


gt_layout-colwidth_optimize = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = g_repid
    is_layout          = gt_layout
    it_fieldcat        = gt_fieldcat[]
    i_save             = 'X'
  TABLES
    t_outtab           = gt_out
  EXCEPTIONS
    program_error      = 1
    OTHERS             = 2.

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

</pre>
